package com.doit.demo02;

import com.doit.demo.Person;

import javax.lang.model.element.VariableElement;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Member;
import java.util.Properties;

/*
$内部类

  BootStrapClassLoader 根类加载器  核心包 null
  ExtClassLoader 扩展类加载器 扩展类包
  AppClassLoader 应用类加载器 我们写的包和第三方包

三各类没有继承关系
但是Ext是APP的父加载器

    双亲委托机制
        如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,
        每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,
        只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载.
 */
public class Test {
    public static void main(String[] args) throws Exception {

        //1.object类的getclass方法
        Class aClass1 = new Person().getClass();
        System.out.println(aClass1);

        //2.类隐藏的静态class属性 包括基本类型
        Class aClass2 = Person.class;
        System.out.println(aClass2);

        System.out.println(aClass1==aClass2);

        //3.Class类的静态方法forName(string classname)
        Class aClass = Class.forName("com.doit.demo.Person");
        System.out.println(aClass);

        //优化方法
        Class clase = getClase();
        System.out.println(clase);
    }
    //获取一个类的字节码文件对象
    public static Class getClase() throws IOException, ClassNotFoundException {
        Properties p = new Properties();

        FileReader fr = new FileReader("day24\\class.pr");

        p.load(fr);
        fr.close();

        String className = p.getProperty("className2");
        Class aClass = Class.forName(className);
        return aClass;
    }
}
